//============================================================================
// Nome        : Auxiliar.h
// Autores     : Grupo 12 da turma 2MIEIC4
//	 		     Luis Carlos Calado Lameirão Goncalves (050509043)
//		         Paula Francisca Ferreira Teixeira (090509139)
//			     Paulo Jorge de Faria dos Reis (080509037)
// Versão      : 1.0
// Data        : Novembro de 2009
// Copyright   : Creative Commons 2.0
// Descrição   : CAL 2011 - TG1
//               Tema 12 - Transporte de pacientes de uma clínica de saúde.
// Nota        : Código reutilizado de trabalho anterior.
//============================================================================

#include "auxiliar.h"

#define d2r (M_PI / 180.0)

void separador(const string& linha, vector<string>& resultado, const string& separadores = ";")
{
    string::size_type posicao1 = linha.find_first_not_of(separadores, 0);		//! Ignorar os primeiros separadores.
    string::size_type posicao2 = linha.find_first_of(separadores, posicao1);	//! Encontra 1º caracter  útil

    while (string::npos != posicao2 || string::npos != posicao1)
    {
        resultado.push_back(linha.substr(posicao1, posicao2 - posicao1));	//! Encontrado um valor delimitado, guardar no resultado
        posicao1 = linha.find_first_not_of(separadores, posicao2);			//! Saltar os separadores
        posicao2 = linha.find_first_of(separadores, posicao1);				//! Início do próximo dado útil
    }
}

int stringParaInteiro(string str)
{
	char numeroC[20];
	int numeroI;
	try
	{
		for(string::size_type i = 0; i < str.length(); i++)
		{
			if(i == 20) throw("Número demasiado grande!");
			if(!isdigit(str[i])) // Verificar se é um digito
			{
				str = str + ": Não é um número!";
				throw(str);
			}
			else
			{
				numeroC[i] = str[i];
			}
		}
	}
	catch(char * erros)
	{
		std::cerr << erros << " Utilizando \"0\"." << std::endl;
		str = "0";
	}
	numeroI = atoi(str.c_str());
return numeroI;
}

string intToString(int n)
{
	std::stringstream out;
	out << n;
	return out.str();
}

//! Calcula a distância entre 2 posições geográficas.
//! Código obtido de http://stackoverflow.com/questions/365826/calculate-distance-between-2-gps-coordinates
double haversine_m(double lat1, double long1, double lat2, double long2)
{
	double dlong = (long2 - long1) * d2r;
	double dlat = (lat2 - lat1) * d2r;
	double a = pow(sin(dlat/2.0), 2) + cos(lat1*d2r) * cos(lat2*d2r) * pow(sin(dlong/2.0), 2);
	double c = 2 * atan2(sqrt(a), sqrt(1-a));
	double d = 6367 * c * 1000;
    return d;
}
